//
//  WBStatusViewModel.swift
//  传智微博
//
//  Created by zhoujiming on 2017/2/16.
//  Copyright © 2017年 gmcc. All rights reserved.
//

import Foundation

/// 单条微博的视图模型
class WBStatusViewModel: CustomStringConvertible{
    // 微博模型
    var status: WBStatus
    
    // 会员图标
    var memberIcon: UIImage?
    
    /// 认证类型，-1：没有认证，0，认证用户，2,3,5: 企业认证，220: 达人
    var vipIcon: UIImage?
    
    // 转发文字
    var retweetedStr: String?
    // 评论文字
    var commentStr: String?
    // 点赞文字
    var likeStr: String?
    
    // 配图视图大小
    var pictureViewSize = CGSize()
    
    // 如果是转发微博，原创微博肯定没有图
    var picURLs: [WBStatusPicture]?{
        return status.retweeted_status?.pic_urls ?? status.pic_urls
    }
    // 被转发微博的问题
    var retweetedText: String?
    
    // 行高
    var rowHeight: CGFloat = 0
    
    /// 构造函数
    ///
    /// - Parameter model: 微博模型
    init(model: WBStatus) {
        self.status = model
        
        // 会员等级 0-6
        if model.user?.mbrank ?? 0 > 0 && model.user?.mbrank ?? 0 < 7 {
            let imageName = "common_icon_membership_level\(model.user?.mbrank ?? 1)"
            
            memberIcon = UIImage(named: imageName)
        }
        
        switch model.user?.verified_type ?? -1 {
        case 0:
            vipIcon = UIImage(named: "avatar_vip")
        case 2,3,5:
            vipIcon = UIImage(named: "avatar_enterprise_vip")
        case 220:
            vipIcon = UIImage(named: "avatar_grassroot")
        default:
            break
        }
        
        retweetedStr = countString(count: model.reposts_count, defaultString: "转发")
        commentStr = countString(count: model.comments_count, defaultString: "评论")
        likeStr = countString(count: model.attitudes_count, defaultString: "赞")
        
        // 计算配图视图模型大小(有原创的计算原创的，有转发的计算转发的)
        pictureViewSize = calcPictureViewSize(count: picURLs?.count ?? 0)
        
        retweetedText = "@" + (status.retweeted_status?.user?.screen_name ?? "")
            + ":" + (status.retweeted_status?.text ?? "")
        
        // 计算行高
        updateRowHeight()
        
    }
    
    var description: String{
        return status.description
    }
    
    /// 根据当前的视图模型内容，计算更新行高
    func updateRowHeight(){
        // 原创微博：顶部分隔视图(12) + 间距(12) + 图像的高度(34) + 间距(12) + 正文高度(需要计算) + 配图视图高度(计算) + 间距(12) ＋ 底部视图高度(35)
        // 被转发微博：顶部分隔视图(12) + 间距(12) + 图像的高度(34) + 间距(12) + 正文高度(需要计算) + 间距(12)+间距(12)+转发文本高度(需要计算) + 配图视图高度(计算) + 间距(12) ＋ 底部视图高度(35)
        let margin: CGFloat = 12
        let iconHeight: CGFloat = 34
        let toolbarHeight: CGFloat = 35
        
        var height: CGFloat = 0
        
        let viewSize = CGSize(width: UIScreen.cz_screenWidth() - 2 * margin, height: CGFloat(MAXFLOAT))
        
        // 1. 计算顶部位置
        height = 2 * margin + iconHeight + margin
        
        // 2. 正文属性文本的高度
        if let text = status.text {
            
            height += text.boundingRect(with: viewSize, options: [.usesLineFragmentOrigin], context: nil).height
        }
        
        // 3. 判断是否转发微博
        if status.retweeted_status != nil {
            
            height += 2 * margin
            
            // 转发文本的高度 - 一定用 retweetedText，拼接了 @用户名:微博文字
            if let text = retweetedText {
                
                height += text.boundingRect(with: viewSize, options: [.usesLineFragmentOrigin], context: nil).height
            }
        }
        
        // 4. 配图视图
        height += pictureViewSize.height
        
        height += margin
        
        // 5. 底部工具栏
        height += toolbarHeight
        
        // 6. 使用属性记录
        rowHeight = height
    }
    
    /// 使用单个图像更新图像视图大小
    ///
    /// - Parameter image: <#image description#>
    func updateSingleImageSize(image: UIImage){
        var size = image.size
        
        // 过宽图像处理
        let maxWidth: CGFloat = 300
        if size.width > maxWidth {
            size.width = maxWidth
            // 等比例调整高度
            size.height = size.width * image.size.height / image.size.width
        }
        
        
        // 过窄图像处理
        let minWidth: CGFloat = 40
        if size.width < minWidth {
            size.width = minWidth
            // 等比例调整高度
            size.height = size.width * image.size.height / image.size.width / 4

        }
        size.height += WBStatusPictureViewOutterMargin
        
        pictureViewSize = size
        
        updateRowHeight()
    }
    
    
    /// 根据图片数量计算大小
    ///
    /// - Parameter count: <#count description#>
    /// - Returns: <#return value description#>
    private func calcPictureViewSize(count: Int)-> CGSize{
        if count == 0 {
            return CGSize()
        }
        
        // 计算高度
        // 根据count 1~9 计算行数
        let row = (count - 1) / 3 + 1
        // 根据行数算高度
        let height = WBStatusPictureViewOutterMargin + CGFloat(row) * WBStatusPictureItemWidth + CGFloat(row - 1) * WBStatusPictureViewInnerMargin
        
        
        return CGSize(width: WBStatusPictureViewWidth, height: height)
    }
    
    
    /// 给定一个数字，返回一个对应的描述结果
    ///
    /// - Parameters:
    ///   - count: 数字
    ///   - defaultString: 默认描述
    /// - Returns: 描述结果
    private func countString(count: Int, defaultString: String)->String{
        if count == 0 {
            return defaultString
        }
        if count < 10000 {
            return count.description
        }
        
        return String(format: "%.02f 万", Double(count)/10000)
    }
}
